public class 面试题 {
    /**
     * ## 面试题：
     *
     * 1. JDK、JRE、JVM的区别:
     *
     *    - JDK:java开发工具包，是java的核心，包括:JRE+编译、运行等命令工具
     *    - JRE:java运行环境，是运行java程序所必须的环境集合，包括:JVM+java系统类库
     *    - JVM:java虚拟机，是java实现跨平台的最核心部分，能够运行java语言所开发的程序
     *
     * 2. java的8种基本数据类型是什么?(简述java的8种基本数据类型)
     *
     *    - 答:8种基本数据类型包括: byte,short,int,long,float,double,boolean,char
     *      - byte:字节型，用于存储整数的，占用1个字节，范围-128到127
     *      - short:短整型，用于存储整数的，占用2个字节，范围-32768到32767
     *      - int:最常用的整型，用于存储整数的，占用4个字节，范围-2^31到2^31-1
     *      - long:长整型，用于存储较大的整数，占用8个字节，范围-2^63到2^63-1
     *      - float:单精度符点数，用于存储小数的，占用4个字节，不能表示精确的值
     *      - double:双精度符点数，最常用的存储小数的类型，占用8个字节，不能表示精确的值
     *      - boolean:布尔型，用于存储true或false，占用1个字节
     *      - char:字符型，采用Unicode字符编码格式，用于存储单个字符，占用2个字节
     *
     * 3. switch可以作用于哪些数据类型上?
     *
     *    - 答:byte,short,int,char,String,枚举，其余类型都不允许
     *
     * 4. 重写(overriding)与重载(overloading)的区别:
     *
     *    - 重写:发生在父子类中，方法名相同，参数列表相同,和返回值类型有关
     *    - 重载:发生在同一类中，方法名相同，参数列表不同,与参数类型有关
     *
     * 5. 实例变量与静态变量的区别:
     *
     *    - 实例变量和静态变量都属于成员变量
     *      - 实例变量:是属于对象的，在创建对象时存储在内存堆中，
     *      创建多少个对象，则实例变量就会在内存中存在多少份，需要通过引用变量来访问
     *      - 静态变量:是属于类的，在类被加载时存储在内存方法区中，
     *      无论创建多少个对象，静态变量在内存中都只有一份，常常通过类名点来访问
     *
     * 6. 抽象类和接口的区别:
     *
     *    - 抽象类:
     *      - 由abstract修饰
     *      - 可以包含变量、常量、构造方法、普通方法、静态方法、抽象方法
     *      - 派生类通过extends继承
     *      - 只能继承一个(单一继承)
     *      - 抽象类中的成员，任何访问权限都可以(默认为默认权限(同包中))
     *    - 接口:
     *      - 由interface定义
     *      - 可以包含常量、抽象方法、静态方法(1.8后)、默认方法(1.8后)
     *      - 实现类通过implements实现
     *      - 可以实现多个(体现多实现)
     *      - 接口中的成员，访问权限只能是public(默认public权限)
     *
     * 7. String s = new String("hello");创建了几个对象?
     *
     *    - 两个。一个是hello字面量对象，另一个是new出来的对象。
     *
     * 8. String常用的方法有哪些?
     *
     *    - length():获取字符串的长度(字符个数)                                 长 length
     *    - trim():去除两边的空白字符                                          去除trim
     *    - toUpperCase()/toLowerCase():将英文部分给转换为全大写字母/全小写字母    大小touppercase/tolowercase
     *    - startsWith()/endsWith():判断是否是以???开始/结束的                  首尾starswith/endswith
     *    - charAt():根据下标找字符                                            下标charat
     *    - indexOf()/lastIndexOf():查找字符串第一次出现/最后一次出现的下标        出现位置indexof/laseindexof
     *    - substring():截取字符串                                             截取substring
     *    - 静态方法valueOf():将其它类型的数据转换为字符串                          转换valueof
     *    - matches():验证匹配(正则表达式)                                       验证matches
     *    - replaceAll():替换(正则表达式)                                       替换replaceall
     *    - split():拆分(正则表达式)                                            拆分split
     *
     * 9. ==和equals()的区别:
     *
     *    - ==可以作用于基本类型，也可以作用于引用类型
     *      - 若为基本类型，则是在比较值是否相等
     *      - 若为引用类型，则是在比较地址值是否相等
     *    - equals()只能作用于引用类型
     *      - Object类的equals()默认比较的还是==(即比较地址)，但是没有参考意义，
     *      所以常常需要重写equals()来比较对象的属性值是否相同。注意:String类重写了equals()来比较字符串的内容是否相同
     *
     * 10. String、StringBuilder、StringBuffer的区别:
     *
     *     - String:由final修饰，所以不能被继承。
     *     底层封装的是final的字符数组，所以为不变对象，每次修改String引用变量的值，都是在创建新的对象。
     *     适合查看，但不适合频繁修改，在实际应用中对于字符串大部分情况下都是在查看，所以String的应用率最高。
     *     - StringBuilder:底层封装的是字符数组，所做操作都是在该数组之上的，
     *     修改效率高，非线程安全的，并发处理的，性能稍快---一般都用StringBuilder
     *     - StringBuffer:底层封装的是字符数组，所做操作都是在该数组之上的，
     *     修改效率高，线程安全的，同步处理的，性能稍慢
     *
     * 11. ArrayList和LinkedList的区别：
     *
     *     - ArrayList是基于数组实现的，容量不够时采用复制方式扩容，而LinkedList使用链表实现
     *
     *     - ArrayList比LinkedList在随机访问的时候效率要高，因为LinkedList是链表结构，需要依次查找元素，性能不高
     *
     *     - LinkedList首尾增删具备很高的效率，而ArrayList的增删性能稍差
     *
     *       > 综合来说，需要频繁读取集合中的元素时，更推荐使用ArrayList，
     *       而在首尾增删操作较多时，更推荐使用LinkedList。ArrayList综合性能优秀，应优选。
     *
     * 12. Collection和Collections的区别：
     *
     *     - Collection是一个集合接口，是集合类的一个顶级接口，它里面定义了集合通用的方法，List与Set直接继承了Collection接口。
     *     - Collections是集合的一个工具类，其中提供了一系列静态方法，用于对集合中的元素进行排序、搜索以及线程安全等操作。
     *
     * 13. java是值传递还是引用传递?
     *
     *     - 在java中，无论是基本类型还是引用类型，都是值传递
     *       - 对于基本类型而言，传递的是具体的值的副本
     *       - 对于引用类型而言，传递的是具体的地址的副本
     *
     * 14. List、Set、Map的区别是什么？
     *
     *     - List：线性表，有序且可重复集合，元素有先后次序，可以按照位置访问元素，可以存储null
     *     - Set：不重复集合，不保证元素的先后次序，可以存储一个null
     *     - Map：元素按照key:value成对存储，可以按照key查找value，查找性能好，
     *     key不能重复，可以存储一个null key-------------可以后期学了Map之后再背
     *
     * 15. 什么是节点流？什么是处理流/过滤流？说出常用的节点流和处理流/过滤流。
     *
     *     - 节点流：可以从或向一个特定的方向(节点)读写数据，直接跟数据源(文件、网络)相连。
     *     常用节点流有：FileInputStream、FileOutputStream等。
     *     - 处理流/过滤流：是指在对一个已经存在的流的基础之上进行功能扩展/加工处理。
     *     常用的处理流：BufferedInputStream、BufferedOutputStream、ObjectInputStream、
     *     ObjectOutputStream、InputStreamReader、OutputStreamWrite、BufferedReader、BufferedWriter、PrintWriter等。
     *
     * 16. 什么是对象序列化？什么是对象反序列化？实现对象序列化需要做哪些工作？
     *
     *     - 序列化：将对象转换为可传输的字节序列的过程称为序列化
     *     - 反序列化：将字节序列还原为对象的过程称为反序列化
     *     - 其实序列化最终的目的是为了对象数据存储，或者进行网络传输。
     *     java实现序列化非常简单，只要求被序列化对象的类实现Serializable接口，
     *     然后使用对象流进行序列化和反序列化即可，使用ObjectOutputStream进行对象序列化，使用ObjectInputStream进行对象反序列化
     *
     * 17. 函数式接口？
     *
     *     - 是指仅仅只包含一个必须被实现类重写的方法，但可以有多个非抽象方法(默认方法、静态方法等)的接口
     *
     * 18. java异常体系：
     *
     *     - 顶层是Throwable，它的下面是Error和Exception
     *       - Error：错误，表示系统级别错误，是不可恢复的错误，
     *       比如：内存溢出、栈溢出等。异常处理机制处理不了
     *       - Exception：异常/意外，表示程序级别错误，可以通过异常处理机制恢复，
     *       下面有很多子类型表达了不同的异常类型，分两个部分：
     *         - RuntimeException非检查异常：程序运行过程中可能会发生的溢出，一般为代码逻辑错误，处理不处理都可以。
     *         像：空指针异常、数组下标越界异常、类型转换异常等。
     *         - 检查异常：为编译期间可以检查到的异常，必须进行处理(或捕获或throws)。
     *         像：IOException、FileNotFoundException等。
     *
     * 19. final、finally、finalize的区别：
     *
     *     - final：是关键字，final修饰的变量初始化后不能被改变，final修饰的方法不能被重写，final修饰的类不能被继承
     *     - finally：是异常处理时的finally块，不管有没有异常被抛出、捕获，finally块都会被执行
     *     - finalize：是个方法名，是在Object类中定义的，因此所有的类都继承了它。
     *     finalize()方法是在垃圾回收器删除对象之前对这个方法进行调用。
     */
}
